# +----------------------------------------------------------------------
# | ChatWork智能聊天办公系统
# +----------------------------------------------------------------------
# | 软件声明: 本系统并非自由软件,未经授权任何形式的商业使用均属非法。
# | 版权保护: 任何企业和个人不允许对程序代码以任何形式任何目的复制/分发。
# | 授权要求: 如有商业使用需求,请务必先与版权所有者取得联系并获得正式授权。
# +----------------------------------------------------------------------
# | Author: ChatWork Team <2474369941@qq.com>
# +----------------------------------------------------------------------
class AgentEnum:
    # 学习状态
    EMB_WAIT = 0  # 等待中
    EMB_LINE = 1  # 排队中
    EMB_ING = 2   # 学习中
    EMB_YES = 3   # 学习成功
    EMB_FAIL = 4  # 学习失败

    # 冻结状态
    FREEZE_NO = 0  # 未冻结
    FREEZE_OK = 1  # 已冻结

    # 权限类型
    POWER_VIEW = 1   # 查看者 [bot=可使用应用对话, kb=查看知识库内容]
    POWER_EDIT = 2   # 编辑者 [bot=可查看和编辑应用, kb=增加和变更知识库内容]
    POWER_ADMIN = 3  # 管理者 [bot=发布|查看日志|分配权限, kb=整理知识库数据和信息]
    POWER_OWNED = 4  # 拥有者

    # 检索类型
    RETRIEVE_SEM = "similar"  # 语义检索
    RETRIEVE_FULL = "full"    # 全文检索
    RETRIEVE_MIX = "mix"      # 混合检索

    @classmethod
    def get_emb_desc(cls, code: int) -> str:
        _desc = {
            cls.EMB_WAIT: "等待中",
            cls.EMB_LINE: "排队中",
            cls.EMB_ING: "学习中",
            cls.EMB_YES: "学习成功",
            cls.EMB_FAIL: "学习失败",
        }
        return _desc.get(code, "")

    @classmethod
    def get_retrieve_desc(cls, code: int) -> str:
        _desc = {
            cls.RETRIEVE_SEM: "语义检索",
            cls.RETRIEVE_FULL: "全文检索",
            cls.RETRIEVE_MIX: "混合检索"
        }
        return _desc.get(code, "")

    @classmethod
    def get_prompt_tpl(cls, scene: str = ""):
        if scene == "chat":
            return """## 任务描述
                你是一个知识库回答助手，使用 <Reference></Reference> 标记中的内容作为本次对话的参考。
                为了是回答结果更精准，你需要用户分析历史对话，综合历史对话和标记内容作为参考再给出答复。

                <Reference>
                [[document]]
                </Reference>

                ## 回答要求:
                    - 如果你不清楚答案，你需要澄清。
                    - 严禁提及您是从 <Reference></Reference> 获取的知识。
                    - 保持答案与 <Reference></Reference> 中描述的一致。
                    - 使用 Markdown 语法优化回答格式。
                    - 使用与问题相同的语言回答。
            """.replace("                ", "").strip()
        elif scene == "issues":
            return """你是一名智能助手，负责深入分析对话历史，精准预测用户的下一个问题。
                你的任务是生成三个具有引导性的潜在问题，旨在激发用户继续对话的兴趣和动力。
                在生成这些问题时，请遵守以下规则：

                1.使用与用户在对话历史中的最后一个问题相同的语言。
                2.着重于最后一轮的问题和AI答复进行生成。
                3.每个问题长度不超过20个字符。

                分析提供给你的对话历史，并将其作为背景来生成相关且引人入胜的后续问题。
                你的预测应该是当前主题或用户可能有兴趣进一步探索的相关领域的逻辑延伸。

                记住，在为用户提供多种选择的同时，要保持与现有对话的语气和风格的一致性。
                你的目标是让对话自然流畅，帮助用户更深入地研究主题或探索相关话题。

                请严格遵守格式规则：
                以JSON格式返回问题：[“问题1”、“问题2”、“疑问3”]。您的输出：
            """.replace("                ", "").strip()
        elif scene == "qa":
            return {
                "system": """<Context></Context> 标记中是一段文本，学习和分析它，并整理学习成果：
                    - 提出问题并给出每个问题的答案。
                    - 答案需详细完整，尽可能保留原文描述，可以适当扩展答案描述。
                    - 答案可以包含普通文字、链接、代码、表格、公示、媒体链接等 Markdown 元素。
                    - 最多提出 50 个问题，务必严格遵守此规则。
                    - 生成的问题和答案和源文本语言相同。""".replace("                    ", "").strip(),
                "user": """请按以下格式整理学习成果:
                    Q1: 问题。
                    A1: 答案。
                    Q2:
                    A2:
                    
                    ------
                    
                    我们开始吧!
                    
                    <Context>
                    {{text}}
                    </Context>""".replace("                    ", "").strip()
            }
        elif scene == "optimize":
            return """作为向量检索助手，你的任务是结合历史记录信息，从多个维度和角度深入分析“原问题”，并据此生成一系列不同版本的“检索词”。
                这些检索词应明确指向与原问题紧密相关的核心概念或信息点，同时保持与原问题相同的语言风格和表达习惯，并且生成最多3条数据。
                通过增加检索词的多样性和语义深度，你的目标是显著提升向量检索的精度和效果，确保检索结果能够更全面、准确地匹配用户需求。
                
                参考 <Example></Example> 标中的示例来完成任务。
                
                <Example>
                <History></History>
                原问题: 介绍下剧情。
                检索词: ["介绍下故事的背景。","故事的主题是什么？","介绍下故事的主要人物。"]
                ----------------
                <History>
                Q: 对话背景。
                A: 当前对话聚焦于Python编程语言的基础知识与应用场景探讨。
                </History>
                原问题: 安装步骤。
                检索词: ["Python编程语言安装步骤详解","如何逐步安装Python？","Python安装过程中需要注意什么？"]
                ----------------
                <History>
                Q: SQL查询。
                A: 当前对话讨论的是SQL数据库查询语言的使用方法。
                </History>
                原问题: 查询重复数据。
                检索词: ["SQL中如何查询重复数据？","使用SQL语句查找数据库中的重复记录","SQL查询重复数据的具体方法是什么？"]
                ----------------
                </Example>
                
                -----
                
                下面是正式的任务：

                历史记录:
                <History>
                {{histories}}
                </History>
                原问题: {{query}}
                检索词: 
                
                请严格遵守格式规则：
                以JSON格式返回检索词：[“检索词1”、“检索词2”、“检索词3”]。您的输出：
                """.replace("                ", "").strip()
        return ""
